package com.aop.utils;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

import org.springframework.stereotype.Component;


/**
 * 切面类，这个里面的方法 称之为通知方法，
 * 如何动态的切入到我们想要的指定位置
 */
@Aspect
@Component
public class LogUtils {

    /**
     * 抽取可重用的切入点表达式
     * 1、随便声明一个没有使用的返回void的空方法
     * 2、给方法上标注@Pointcut注解
     */
    @Pointcut("execution(public int com.aop.impl.CalculatorImpl.*(int, int))")
    public void myPoint(){}


    @Around("myPoint()")
    public Object myRound(ProceedingJoinPoint pjp) throws Throwable {
        String name = pjp.getSignature().getName();
        Object[] args = pjp.getArgs();
        Object proceed = null;
        try{
            //利用反射获取到目标方法
            System.out.println("[环绕前置通知]["+ name+"方法开始]");
            proceed = pjp.proceed(args);
            System.out.println("[环绕返回通知]["+name+"方法返回] ,返回值"+proceed);
        }catch (Exception e){
            System.out.println("[环绕异常通知]["+name+"]方法出现异常，异常信息：" + e);
        }finally {
            System.out.println("[环绕后置通知]["+name+"]方法结束");
        }
        return  proceed;
    }


/*

   @Before("myPoint()")
    public static void logStart(JoinPoint joinPoint){
       Object[] objects = joinPoint.getArgs();
       Signature signature = joinPoint.getSignature();
       String methodName = signature.getName();
       System.out.println("["+methodName+"] 方法开始了，他使用的参数是["+objects+"]");
    }

    @AfterReturning(value = "myPoint()",returning = "result")
    public static void logReturn(JoinPoint joinPoint,Object result){
        Object[] objects = joinPoint.getArgs();
        Signature signature = joinPoint.getSignature();
        String methodName = signature.getName();
        System.out.println("["+methodName+"] 方法执行完成，执行的结果是["+result+"]");
    }
    @AfterThrowing(value = "myPoint()",throwing = "e")
    public static void logException(JoinPoint joinPoint,Exception e){

        Signature signature = joinPoint.getSignature();
        String methodName = signature.getName();
        System.out.println("["+methodName+"] 方法出现了异常，异常信息是["+e.getMessage()+"]");
    }

    @After("myPoint()")
    public static void logEnd(JoinPoint joinPoint){
        Object[] objects = joinPoint.getArgs();
        Signature signature = joinPoint.getSignature();
        String methodName = signature.getName();
        System.out.println("["+methodName+"] 方法执行结束，他使用的参数是["+objects+"]");
    }*/

/*    @Before("execution(public int com.aop.impl.CalculatorImpl.*(int, int))")
    public static void logStart(){
        System.out.println("[xxx] 方法开始了，他使用的参数是[xxx]");
    }
    @AfterReturning("execution(public int com.aop.impl.CalculatorImpl.*(int,int))")
    public static void logReturn(){
        System.out.println("[xxx] 方法执行完成，执行的结果是[xxx]");
    }
    @AfterThrowing("execution(public int com.aop.impl.CalculatorImpl.*(int,int))")
    public static void logException(){
        System.out.println("[xxx] 方法出现了异常，异常信息是[xxx]");
    }
    @After("execution(public int com.aop.impl.CalculatorImpl.*(int,int))")
    public static void logEnd(){
        System.out.println("[xxx] 方法执行结束，他使用的参数是[xxx]");
    }*/
}
